.. :validated: 3.2.0

Журнал операций в 389 DS при переключении на системную учетную запись в серверной части ALD Pro
===============================================================================================

Начиная с версии 3.2.0 **ALD Pro** на каждом контроллере домена (далее -- КД) ведется отдельный журнал **ALD Pro**. В него записываются только те операции, которые были инициированы через **API ALD Pro** и выполнены в контексте системной учетной записи. Такие операции требуются, когда у обычной учетной записи пользователя недостаточно прав.

Основные особенности журнала операций:

1. Журнал создается и начинает наполняться на каждом контроллере домена автоматически при установке с нуля **ALD Pro** версии 3.2.0 или обновлении до **ALD Pro** 3.2.0;

2. Журнал ведется в файле ``/var/log/aldpro/sysaccounts_requsts.log``; 
 
3. Права на данный журнал полностью аналогичны остальным файлам в каталоге ``/var/log/aldpro`` (владелец и группа ``ipaapi``, права на файл в формате UGO - 640);

4. Для журнала при установке серверной части **ALD Pro** автоматически создается отдельная конфигурация для утилиты ``logrotate``.

    Особенности утилиты ``logrotate``:

    * максимальный размер файла журнала -- 100 Мб;
    * максимальное количество журналов -- 10;
    * все хранящиеся журналы, кроме двух последних, автоматически сжимаются.

    Файл конфигурации для утилиты ``logrotate`` находится по пути ``/etc/logrotate.d/aldpro-mp-core``.

5. Включением и выключением записи в журнал для конкретного экземпляра серверной части **ALD Pro** на КД можно управлять с помощью параметра ``ENABLE_SYSACCOUNTS_REQUESTS_LOG``.

    Для отключения ведения журнала необходимо выполнить следующие действия (журнал по умолчанию ведется на каждом КД):

       - добавить строку ``ENABLE_SYSACCOUNTS_REQUESTS_LOG=FALSE`` в файл ``/etc/aldpro/core.env``;

       - выполнить перезапуск сервиса ``apache2`` с помощью команды:

    .. code-block:: bash

        sudo apachectl -k graceful

    или с помощью команды:

    .. code-block:: bash

        sudo systemctl restart apache2

    После выполнения этих действий, операции в журнал записываться не будут.

    Для включения записи в журнал необходимо:

       - удалить из файла ``/etc/aldpro/core.env`` строку ``ENABLE_SYSACCOUNTS_REQUESTS_LOG=FALSE``;

       - выполнить перезапуск сервиса ``apache2``.

6. В журнале ``/var/log/aldpro/sysaccounts_requsts.log`` для каждой отдельной операции (поиска, изменения, создания или удаления) создаются отдельные json-объекты с определенной структурой. Разделителями между парами "ключ-значение" в одном объекте являются пробелы. Также пробел ставится перед значением. 

Пример json-объекта из файла журнала

.. code-block::

    {"principal": "admin@ALD.PRO.RU", "req_time": "20260303145146", "op": "modify", "dn": "cn=5a92466a-d1ec-404a-8544-2bf23e7c9b11,cn=gpolicy,cn=gp,dc=ald,dc=pro,dc=ru", "sysaccount": "uid=saltstackservice_dc01,cn=sysaccounts,cn=etc,dc=ald,dc=pro,dc=ru", "request_uri": "/ad/api/ds/group-policies/5a92466a-d1ec-404a-8544-2bf23e7c9b11/organizational-units", "request_method": "POST", "mod_wsgi_request_id": "IkbfU345raI", "remote_addr": "192.168.2.1", "remote_port": "56476", "result": "0", "resp_time": "20260303145146"}

где:

* ``"req_time"`` -- время, когда посылается запрос от системной УЗ в формате YYYYMMDDhhmmss, например 20250930101420 (local time);
* ``"resp_time"`` -- время, когда на серверной части получен ответ от 389 DS в формате YYYYMMDDhhmmss, например 20250930101545 (local time);
* ``"result"`` -- код результата выполнения операции, который должен быть равен нулю (0) в случае успешной операции или содержать строку ошибки, которую вернул 389 DS;
* ``"principal"`` -- имя принципала, который инициировал действие (вызов **API ALD Pro** через портал управления или иным способом);
* ``"sysaccount"`` -- имя (dn в 389 DS) системной УЗ, от которой будет выполняться операция в 389 DS;
* ``"op"`` -- тип операции, который будет выполняться (может содержать содержать 4 значения: ``add`` для операций добавления записи, ``delete``  для операций удаления записи, ``modify`` для операций модификации и ``srch`` для операций поиска записей в 389 DS);
* ``"dn"`` -- тот dn, к которому совершается операция;
* ``"request_uri"`` -- полный путь запроса (путь для вызова API);
* ``"request_method"`` -- HTTP-метод, использованный в запросе, он определяет тип запрошенного действия;
* ``"mod_wsgi_request_id"`` -- уникальный идентификатор запроса, генерируемый модулем ``mod_wsgi``;
* ``"remote_addr"`` -- IP-адрес клиента (пользователя), который установил соединение с сервером (адрес последнего proxy-сервера в сетевом маршруте до клиента);
* ``"remote_port"`` -- номер порта на устройстве клиента, с которого был отправлен запрос.

Для запросов с операцией поиска (``"op":"srch"``) дополнительно добавляются следующие ключи:

* ``"scope"`` -- значение глубины поиска для запроса типа ``srch`` (целое число);

* ``"filter"`` -- строка фильтра для поиска для запроса типа ``srch`` (может быть ``null``);

* ``"attrs"`` - список атрибутов, значения которых запрашиваются в запросе типа ``srch``.

Если запрос имеет тип, отличный от ``srch``, то ключи ``scope``, ``filter`` и ``attrs`` не создаются в json-объекте.

Пример json-объекта из файла журнала, в котором записан запроса на поиск информации (тип ``srch``):

.. code-block::

    {"principal": "admin@ALD.PRO.RU", "req_time": "20260303145146", "op": "srch", "dn": "cn=5a92466a-d1ec-404a-8544-2bf23e7c9b11,cn=gpolicy,cn=gp,dc=ald,dc=pro,dc=ru", "sysaccount": "uid=saltstackservice_dc01,cn=sysaccounts,cn=etc,dc=ald,dc=pro,dc=ru", "request_uri": "/ad/api/ds/group-policies/5a92466a-d1ec-404a-8544-2bf23e7c9b11/organizational-units", "request_method": "POST", "mod_wsgi_request_id": "IkbfU719raI", "remote_addr": "192.168.2.1", "remote_port": "56476", "scope": 0, "filter": null, "attrs": ["modifyTimestamp", "rbtapolicyversion", "primarykey", "member", "memberOf", "aldproPolicyAllowFilterEnabled", "cn", "displayName", "entryid", "aldproChangesAuthtor", "fullname", "createTimestamp", "description", "aldproPolicyDenyFilterEnabled", "parentid", "objectClass"], "result": "0", "resp_time": "20260303145146"}

В примере показано, что происходит запрос на поиск и получение информации по набору атрибутов, перечисленных в массиве значений для ключа ``"attrs"`` у записи с ``dn``, равным ``"cn=5a92466a-d1ec-404a-8544-2bf23e7c9b11,cn=gpolicy,cn=gp,dc=ald,dc=pro,dc=ru"`` и происходит это по запросу пользователя c ``uid=admin`` со сменой учетной записи на ``uid=saltstackservice_dc01,cn=sysaccounts,cn=etc,dc=ald,dc=pro,dc=ru``. При этом был вызван метод **POST** по пути ``/ad/api/ds/group-policies/5a92466a-d1ec-404a-8544-2bf23e7c9b11/organizational-units``.

7. Если при запуске приложения (серверной части **ALD Pro**) невозможно осуществить инициализацию записи в журнал ``/var/log/aldpro/sysaccounts_requsts.log`` по любой из причин, то серверная часть **ALD Pro** не стартует. В журнал ``syslog`` записывается ошибка (код ``ERROR``) с текстом: "Произошла следующая ошибка при запуске бэкенда ALD Pro: {текст_ошибки}".  

Если журнал ``/var/log/aldpro/sysaccounts_requsts.log`` станет недоступен для записи в процессе работы приложения серверной части **ALD Pro**, то приложение продолжит свою работу, но при любой неуспешной попытке записи информации в журнал ``/var/log/aldpro/sysaccounts_requsts.log`` будет предпринята попытка записи сообщения об ошибке (код ``ERROR``) в журнал ``syslog`` с текстом "Невозможно выполнить запись в журнал ``/var/log/aldpro/sysaccounts_requsts.log``. Ошибка: {текст_ошибки}".
